package com.example.leetcode.trainingcamp.week10.thursday;

import java.util.Arrays;

/**
 * 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集，使得两个子集的元素和相等。
 *
 *  
 *
 * 示例 1：
 *
 * 输入：nums = [1,5,11,5]
 * 输出：true
 * 解释：数组可以分割成 [1, 5, 5] 和 [11] 。
 * 示例 2：
 *
 * 输入：nums = [1,2,3,5]
 * 输出：false
 * 解释：数组不能分割成两个元素和相等的子集。
 *  
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/partition-equal-subset-sum
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class Test416 {

    public boolean canPartition(int[] nums) {
        int sum = Arrays.stream(nums).sum();
        if(sum % 2 == 1) {
            return false;
        }
        int total = sum / 2 ;
        boolean [][] dp = new boolean[nums.length][total+1];
        dp[0][0] = true;
        if (nums[0] < total) {
            dp[0][nums[0]] = true;
        }
        if (nums[0] == total) {
            return true;
        }
        for (int i =1;i<nums.length;i++){
            for (int j =0;j<=total;j++){
                if (dp[i - 1][j] || ( j - nums[i] >=0 && dp[i - 1][j - nums[i]])){
                    dp[i] [j] = true;
                    if ( j == total){
                        return true;
                    }
                }
            }
        }
        return false;
    }
}


class Demo416{
    public static void main(String[] args) {
        int[] nums = {1,2,3,5};
        Test416 t = new Test416();
        System.out.println(t.canPartition(nums));
    }
}